import * as types from "../action-types";
import {takeEvery,put,call,apply} from 'redux-saga/effects';
import {delay} from '../utils';


export function* incrementAsync() {
    //当yield一个promise的时候，saga中间件可以接收到这个promise，他会等待这个promise完成，然后把reslove的值赋给msg
    // let msg = yield  delay(1000);

    //1。通过状态判断请求是否成功：
    /* try {
         //这里需用到我自己的delay，原生的delay:{type:'CALL',{context: null, args: Array(1), fn: ƒ}}   和call(delay,1000)一模一样！！！
         let  msg= yield call(delay,1000);
         // put：紧接着再次向仓库派发  INCREMENT动作
         yield put({type:types.INCREMENT})

     }catch (e) {
        console.log(e)
     }
 */
    //通过状态码来判断
    let {code,data,err} = yield call(delay,1000)
    if (code === 0) {
        console.log('code',code);
        yield put({type:types.INCREMENT})
    } else  {
        // console.log(err)
        alert(err)
    }


    //call和apply  ： 改变this指向应用：如果想让函数执行的时候，绑定this指针，
    // let obj = {username:'ygg'}
    // let msg = yield call([obj,delay],1000)
    // let msg = yield apply(obj,delay,[1000])

}

export function*  watchIncrementAsync() {
    //takeEvery:监听每一次的ASYNC_INCREMENT的动作，每当有人向仓库里派发这个动作的时候，就会调用另外一个work saga 去执行
    //每当yield一个值，一般被称为effect，就相当于告诉saga中间件进行某些处理。

    yield takeEvery(types.ASYNC_INCREMENT,incrementAsync)
}
